/*
 * Copyright (c) 2025 Li Auto Inc. and its affiliates
 * Licensed under the Apache License, Version 2.0(the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*!*********************************************************************************************************************
 * @file        cannm_lcfg.h
 * @brief       CanNm本地配置头文件
 * @details     主要包含CanNm模块本地配置相关信息
 * @date        {{get_generation_time_temp()}}

 * @toolversion {{get_vcos_version_temp()}}
 **********************************************************************************************************************/

#ifndef CANNM_LCFG_H
#define CANNM_LCFG_H

#include "cannm_types.h"
#if (CONFIG_MODULE_COMM == 1)
#include "comm_cfg.h"
#endif
#include "Compiler.h"
#include "cannm_internal.h"

#ifdef __cplusplus
extern "C"
{
#endif

{%- set cannm_multicore = get_cannm_multicore_or_not() %}
{%- set cannm_channel_list = get_cannm_channel_config() %}
{%- set cannm_rx_pdu_list = get_cannm_channel_rx_pdu_config() %}
{%- for channel_index in range(cannm_channel_list | length) %}
#ifndef {{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmTxUserDataPduId }}
#define {{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmTxUserDataPduId }}  ({{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmComMNetworkHandleRef }}) ///< CanNm配置ComCanNmTx PDU ID
#endif
#ifndef {{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmTxConfirmationPduId }}
#define {{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmTxConfirmationPduId }}  ({{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmComMNetworkHandleRef }}) ///< CanNm配置TX CONFIRMATION PDU ID
#endif
{%- for CanNmRxPduIndex in range(cannm_rx_pdu_list[channel_index] | length) %}
#ifndef {{ cannm_rx_pdu_list[channel_index][CanNmRxPduIndex] }}
#define {{ cannm_rx_pdu_list[channel_index][CanNmRxPduIndex] }}  ({{ CanNmConfig.CanNmChannelConfig[channel_index].CanNmComMNetworkHandleRef }}) ///< CanNm配置Rx PDU ID
#endif
{%- endfor %}
{%- endfor %}

{%- if CanNmConfig.CanNmGlobalConfig.CanNmCalloutConfig == True %}
/*!*********************************************************************************************************************
 * @brief   CanNm回调函数的声明
 **********************************************************************************************************************/
extern Std_ReturnType (*CANNM_CALLBACK_FUNCTION)(void);
{%- endif %}

#define CANNM_START_SEC_CODE
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief          通过核Id映射通道Id
 * @details        CanNm通过核Id映射通道Id
 * @param[in]      cannm_network_id 通道号
 * @reentrant      不可重入
 * @synchronous    同步
 **********************************************************************************************************************/
FUNC_P2CONST(cannm_core_channel_id_mapping_type, AUTOMATIC, CANNM_CODE) cannm_channel_id_mapping_by_core_id(cannm_core_id_type core_id);
/*!*********************************************************************************************************************
 * @brief          获取首帧请求标志位函数
 * @details        CanNm获取首帧请求标志位函数
 * @param[in]      cannm_network_id 通道号
 * @reentrant      不可重入
 * @synchronous    同步
 **********************************************************************************************************************/
FUNC(boolean, CANNM_CODE) cannm_get_retry_first_msg_flg(network_handle_type cannm_network_id);
#define   CANNM_STOP_SEC_CODE
#include "cannm_memmap.h"

{%- set cannm_pn_filter_mask_byte_config = get_cannm_pn_filter_mask_byte_config() %}
{%- if (cannm_pn_filter_mask_byte_config | length) > 0 %}
#define CANNM_START_SEC_CONST
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief   CanNm局部网络掩码值的声明
 **********************************************************************************************************************/
extern CONST(uint8, CANNM_CONST) cannm_pn_info_mask_value[{{cannm_pn_filter_mask_byte_config | length}}];
/*!*********************************************************************************************************************
 * @brief   CanNm局部网络索引时间映射值的声明
 **********************************************************************************************************************/
extern CONST(uint8, CANNM_CONST) cannm_pn_index_to_timer_map_value[{{cannm_pn_filter_mask_byte_config | length}}];
/*!*********************************************************************************************************************
 * @brief   CanNm时间索引到局部网络映射值的声明
 **********************************************************************************************************************/
extern CONST(uint8, CANNM_CONST) cannm_timer_index_to_pn_map_value[{{cannm_pn_filter_mask_byte_config | length}}];
#define CANNM_STOP_SEC_CONST
#include "cannm_memmap.h"
{%- endif %}

#define CANNM_START_SEC_CONST
#include "cannm_memmap.h"

/*!*********************************************************************************************************************
 * @brief   CanNm重试首帧请求标志位的声明
 **********************************************************************************************************************/
extern CONST(boolean, CANNM_CONST) cannm_retry_first_msg_req_flag_list[CANNM_CHANNEL_COUNT];

/*!*********************************************************************************************************************
 * @brief   CanNm核与通道的映射的声明
 **********************************************************************************************************************/
extern CONST(cannm_core_channel_id_mapping_type, CANNM_CONST) cannm_core_channel_id_mapping[CANNM_CORE_MAX_COUNT];
#define CANNM_STOP_SEC_CONST
#include "cannm_memmap.h"

{%- set cannm_multicore = get_cannm_multicore_or_not() %}
{%- if cannm_multicore == "STD_ON" %}
#define CANNM_START_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief   CanNm内部全局变量的声明
 **********************************************************************************************************************/
extern VAR(cannm_internal_type, CANNM_MULTI_APP_BSS) cannm_internal;
#define CANNM_STOP_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"

/* 首帧报文发出时间点 */
#define CANNM_START_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief   CanNm配置全局变量的声明
 **********************************************************************************************************************/
extern P2CONST(cannm_cate_cfg, CANNM_MULTI_APP_BSS, BSW_CONST) cannm_config_ptr;
#define CANNM_STOP_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"

#define CANNM_START_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"
#if (CANNM_RETRY_FIRST_MESSAGE_REQUEST == STD_ON)
/*!*********************************************************************************************************************
 * @brief   CanNm发送标志位的声明
 **********************************************************************************************************************/
extern VAR(uint8, CANNM_MULTI_APP_BSS) canif_transmit_flag;
/*!*********************************************************************************************************************
 * @brief   CanNm重试首帧报文请求值的声明
 **********************************************************************************************************************/
extern VAR(boolean, CANNM_MULTI_APP_BSS) cannm_retry_first_msg_flg[CANNM_CHANNEL_COUNT];
#endif
/*!*********************************************************************************************************************
 * @brief   CanNm发送时间值的声明
 **********************************************************************************************************************/
extern VAR(uint32, CANNM_MULTI_APP_BSS) canif_transmit_time_value;
/*!*********************************************************************************************************************
 * @brief   CanNm首帧发送消息ID的声明
 **********************************************************************************************************************/
extern VAR(uint16, CANNM_MULTI_APP_BSS) canif_first_nm_msg_id;
/*!*********************************************************************************************************************
 * @brief   CanNm统计数据的声明
 **********************************************************************************************************************/
extern VAR(cannm_msg_cnt_cate, CANNM_MULTI_APP_BSS) cannm_msg_cnt;
#define CANNM_STOP_SEC_MULTI_APP_BSS
#include "cannm_memmap.h"
{%- else %}
#define CANNM_START_SEC_PRIVATE_DATA
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief   CanNm内部全局变量的声明
 **********************************************************************************************************************/
extern VAR(cannm_internal_type, CANNM_PRIVATE_DATA) cannm_internal;
#define CANNM_STOP_SEC_PRIVATE_DATA
#include "cannm_memmap.h"

/* 首帧报文发出时间点 */
#define CANNM_START_SEC_PRIVATE_BSS
#include "cannm_memmap.h"
/*!*********************************************************************************************************************
 * @brief   CanNm配置全局变量的声明
 **********************************************************************************************************************/
extern P2CONST(cannm_cate_cfg, CANNM_PRIVATE_BSS, CANNM_CONST) cannm_config_ptr;
#define CANNM_STOP_SEC_PRIVATE_BSS
#include "cannm_memmap.h"

#define CANNM_START_SEC_PRIVATE_BSS
#include "cannm_memmap.h"
#if (CANNM_RETRY_FIRST_MESSAGE_REQUEST == STD_ON)
/*!*********************************************************************************************************************
 * @brief   CanNm发送标志位的声明
 **********************************************************************************************************************/
extern VAR(uint8, CANNM_PRIVATE_BSS) canif_transmit_flag;
/*!*********************************************************************************************************************
 * @brief   CanNm重试首帧报文请求值的声明
 **********************************************************************************************************************/
extern VAR(boolean, CANNM_PRIVATE_BSS) cannm_retry_first_msg_flg[CANNM_CHANNEL_COUNT];
#endif
/*!*********************************************************************************************************************
 * @brief   CanNm发送时间值的声明
 **********************************************************************************************************************/
extern VAR(uint32, CANNM_PRIVATE_BSS) canif_transmit_time_value;
/*!*********************************************************************************************************************
 * @brief   CanNm首帧发送消息ID的声明
 **********************************************************************************************************************/
extern VAR(uint16, CANNM_PRIVATE_BSS) canif_first_nm_msg_id;
/*!*********************************************************************************************************************
 * @brief   CanNm统计数据的声明
 **********************************************************************************************************************/
extern VAR(cannm_msg_cnt_cate, CANNM_PRIVATE_BSS) cannm_msg_cnt;
#define CANNM_STOP_SEC_PRIVATE_BSS
#include "cannm_memmap.h"
{%- endif %}

#ifdef __cplusplus
}
#endif

#endif /* CANNM_LCFG_H */
